/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.seguridad.controlador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.conexion.cConexion;
import sv.com.intesal.rrhh.bean.Empleado;
import sv.com.intesal.seguridad.bean.Usuario;
import sv.com.intesal.seguridad.sql.SQLUsuario;

/**
 *
 * @author andrew
 */
public class UsuarioControlador {

    public List<Usuario> fillGrid() throws Exception {
        List<Usuario> list = new ArrayList<Usuario>();
        try {
            ResultSet rs = cConexion.conectar().prepareStatement(SQLUsuario.usuarioBuscar).executeQuery();
            while (rs.next()) {
                Usuario u = new Usuario();
                u.setCodigo_u(rs.getInt("id_u"));
                u.setCodigo_e(rs.getInt("id_e"));
                u.setUsername(rs.getString("usuario_u"));
                u.setPw(rs.getString("clave_u"));
                u.setPwc(rs.getString("clave_u"));
                u.setNivel(rs.getInt("nivel_u"));
                u.setEstado(rs.getString("estado_u"));
                u.setNombre_e(rs.getString("nombre_e"));
                u.setApellido_e(rs.getString("apellido_e"));
                u.setEstado_filter_u(false);
                if (rs.getString("estado_u").equals("I")) {
                    u.setEstado_filter_u(true);
                }
                list.add(u);
            }
            rs.close();
            return list;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void mantUsuario(Usuario u) throws Exception {

        try {
            PreparedStatement ps = null;
            Connection cnn = cConexion.conectar();

            if (u.getCodigo_u() == null) {
                /* INSERTING"  */
                ps = cnn.prepareStatement(SQLUsuario.usuarioIsertar);
                ps.setInt(5, u.getCodigo_e());
            } else {
                /*  UPDATING  */
                ps = cnn.prepareStatement(SQLUsuario.usuarioModificar);
                ps.setInt(5, u.getCodigo_u());
            }
            ps.setString(1, u.getUsername());
            ps.setString(2, u.getPw());
            ps.setInt(3, u.getNivel());

            if (u.getEstado_filter_u() == false) {
                ps.setString(4, "A"); // Activo
            } else {
                ps.setString(4, "I"); // Inactivo
            }
            ps.executeUpdate();
            ps.close();

            Mensaje m = new Mensaje();
            if (u.getCodigo_u() == null) {
                RolesControlador rc = new RolesControlador();
                rc.insert_Formulario_Usuario_Roles();
                m.message(m.getIinformation());
            } else {
                m.message(m.getImodificada());
            }
        } catch (Exception ex) {
            throw new Exception(ex);
        }
    }

    public void updateUsuarioClave(Usuario u) throws Exception {
        try {
            SessionControlador sc = new SessionControlador();
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLUsuario.updateClaveUsuario);
            ps.setString(1, u.getPw());
            ps.setInt(2, sc.getCodigo_Usuario());

            ps.executeUpdate();

            Mensaje m = new Mensaje();
            m.messageInfo(m.getImodificada());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public boolean ExistUsuario(Usuario u) throws Exception {

        try {

            if (u.getCodigo_u() != null) {
                //MODIFY USER
                PreparedStatement ps = cConexion.conectar().prepareStatement(SQLUsuario.usuarioExistCodigo);
                ps.setString(1, u.getUsername());
                ps.setInt(2, u.getCodigo_u());

                ResultSet rs = ps.executeQuery();
                rs.next();
                if (rs.getInt(1) == 1) {
                    return false; //continuar con flujo normal
                }
            }

            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLUsuario.usuarioExist);
            ps.setString(1, u.getUsername());
            ResultSet rs = ps.executeQuery();
            rs.next();

            if (rs.getInt(1) == 1) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public boolean existeUsuario_Empleado(Empleado em) throws Exception {

        try {
            Connection cnn = cConexion.conectar();
            ResultSet rs = null;
            PreparedStatement pstm = cnn.prepareStatement(SQLUsuario.usuarioEmpleadoExist);
            pstm.setInt(1, em.getId_e());
            rs = pstm.executeQuery();
            rs.next();
            int count = rs.getInt(1);

            cnn.close();
            pstm.close();
            rs.close();

            if (count == 1) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public ResultSet getUsuarios() throws Exception {

        try {
            ResultSet rs = cConexion.conectar().prepareStatement(SQLUsuario.getCodigoUsuarios).executeQuery();
            return rs;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Integer getMax() throws Exception {
        try {
            ResultSet rs = cConexion.conectar().prepareStatement(SQLUsuario.getMax).executeQuery();
            rs.next();
            return rs.getInt("max");
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Usuario getUsuario(Integer codigo_u) throws Exception {

        Usuario u = new Usuario();
        PreparedStatement ps = null;
        Connection cnn = null;
        ResultSet rs = null;
        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLUsuario.getDatosUsuario);
            ps.setInt(1, codigo_u);
            rs = ps.executeQuery();
            rs.next();

            u.setCodigo_u(rs.getInt("id_u"));
            u.setUsername(rs.getString("usuario_u"));
            u.setNivel(rs.getInt("nivel_u"));
            u.setEstado(rs.getString("estado_u"));
            u.setPw(rs.getString("clave_u"));

            rs.close();
            ps.close();
            cnn.close();
            return u;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validarClaveUsuario(Usuario u) throws Exception {
        try {
            SessionControlador sc = new SessionControlador();
            Usuario us = this.getUsuario(sc.getCodigo_Usuario());

            if (u.getPwOld().toString().equals(us.getPw().toString())) {
                return true;
            }
            return false;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}
